#define __QYQ_MODULE_SMG_C_
#include "qyq_module_smg.h"

static uint8_t qyq_module_smg_font[][2] = {
    {0xFF, 0},
    {'0', 0x3F}, //"0"
    {'1', 0x06}, //"1"
    {'2', 0x5B}, //"2"
    {'3', 0x4F}, //"3"
    {'4', 0x66}, //"4"
    {'5', 0x6D}, //"5"
    {'6', 0x7D}, //"6"
    {'7', 0x07}, //"7"
    {'8', 0x7F}, //"8"
    {'9', 0x6F}, //"9"
    {'A', 0x77}, //"A"
    {'B', 0x7C}, //"B"
    {'C', 0x39}, //"C"
    {'D', 0x5E}, //"D"
    {'E', 0x79}, //"E"
    {'F', 0x71}, //"F"
    {'H', 0x76}, //"H"
    {'L', 0x38}, //"L"
    {'n', 0x37}, //"n"
    {'U', 0x3E}, //"u"
    {'P', 0x73}, //"P"
    {'O', 0x5C}, //"o"
    {'-', 0x40}, //"-"
};

static uint8_t qyq_module_smg_getfont(uint8_t value)
{
    uint8_t i = 0;
    for (i = 0; i < sizeof(qyq_module_smg_font) / 2; i++)
    {
        if (value == qyq_module_smg_font[i][0])
        {
            return i;
        }
    }
    return 0;
}

static int8_t qyq_module_smg_scan(qyq_module_smg_type_t *this)
{
    if (this == null)
    {
        return -1;
    }

    this->qyq_module_smg_config->qyq_module_smg_config_writedat(this->qyq_module_smg_config->qyq_module_smg_off_value);
    this->qyq_module_smg_config->qyq_module_smg_config_writeaddr(this->qyq_module_smg_config->qyq_module_smg_data_count);
    this->qyq_module_smg_config->qyq_module_smg_config_writedat(qyq_module_smg_font[qyq_module_smg_getfont(this->qyq_module_smg_config->qyq_module_smg_data_value[this->qyq_module_smg_config->qyq_module_smg_data_count])][1]);
    if (this->qyq_module_smg_config->qyq_module_smg_config_delay != null)
    {
        this->qyq_module_smg_config->qyq_module_smg_config_delay();
    }
    this->qyq_module_smg_config->qyq_module_smg_data_count++;
    if (this->qyq_module_smg_config->qyq_module_smg_data_count >= this->qyq_module_smg_config->qyq_module_smg_number)
    {
        this->qyq_module_smg_config->qyq_module_smg_data_count = 0;
    }

    return 0;
}

static int8_t qyq_module_smg_write(qyq_module_smg_type_t *this, uint8_t smg_id, uint8_t value)
{
    if (this == null)
    {
        return -1;
    }

    this->qyq_module_smg_config->qyq_module_smg_data_value[smg_id] = value;

    return 0;
}

int8_t qyq_module_smg_create(qyq_module_smg_type_t *this, qyq_module_smg_config_t *qyq_module_smg_config)
{
    if (this == null)
    {
        return -1;
    }
    if (qyq_module_smg_config == null)
    {
        return -1;
    }

    this->qyq_module_smg_config = qyq_module_smg_config;
    this->qyq_module_smg_config->qyq_module_smg_data_count = 0;
    qyq_module_smg_font[0][1] = this->qyq_module_smg_config->qyq_module_smg_off_value;

    this->qyq_module_smg_scan = qyq_module_smg_scan;
    this->qyq_module_smg_write = qyq_module_smg_write;

    return 0;
}
